package com.lyq.view;

import com.lyq.bean.Admin;
import com.lyq.dao.AdminDao;
import com.lyq.utils.Tools;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.net.URL;

/**
 * 密码修改界面类
 * 负责提供管理员修改密码的交互界面，包括旧密码验证、新密码输入及确认功能
 */
public class ChangPasswordView {
    // 主窗口对象，承载所有界面组件
    private final JFrame frame;

    // 窗口宽度常量
    private final int WIDTH = 400;

    // 窗口高度常量
    private final int HEIGHT = 270;

    // 旧密码输入框
    private JTextField oldPasswordField;
    // 新密码输入框
    private JPasswordField newPasswordField;
    // 确认密码输入框
    private JPasswordField confirmPasswordField;

    /**
     * 构造方法：初始化密码修改窗口
     * 完成窗口基本设置、组件初始化及图标加载等操作
     */
    public ChangPasswordView() {
        // 初始化主窗口
        frame = new JFrame();

        // 初始化界面组件（输入框、按钮等）
        initView();

        // 设置窗口标题
        frame.setTitle("学生信息管理系统");

        // 使用绝对布局（手动指定组件位置和大小）
        frame.setLayout(null);

        // 禁止窗口调整大小
        frame.setResizable(false);

        // 调用工具类方法，将窗口居中显示
        Tools.setPos(frame, WIDTH, HEIGHT);

        // 设置窗口可见
        frame.setVisible(true);

        // 设置窗口关闭时的操作：关闭当前窗口
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        // 加载并设置窗口图标
        try {
            // 通过类加载器从资源目录获取logo图片路径
            URL imageUrl = getClass().getResource("/image/logo.png");
            if (imageUrl != null) {
                // 读取图片资源并设置为窗口图标
                Image logo = ImageIO.read(imageUrl);
                frame.setIconImage(logo);
            } else {
                System.out.println("LOGO图标资源不存在（路径：/image/logo.png）");
            }
        } catch (IOException e) {
            System.out.println("LOGO图标加载失败：" + e.getMessage());
        }

        // 验证窗口组件布局
        frame.validate();
    }

    /**
     * 初始化界面组件
     * 负责创建并添加所有输入框、标签、按钮到窗口，并设置它们的位置和大小
     */
    private void initView() {
        // 旧密码标签：提示用户输入旧密码
        JLabel oldPasswordLabel = new JLabel("旧密码");
        oldPasswordLabel.setBounds(85, 34, 54, 14);
        frame.getContentPane().add(oldPasswordLabel);

        // 旧密码输入框：接收用户输入的旧密码
        oldPasswordField = new JTextField();
        oldPasswordField.setBounds(149, 31, 131, 20);
        oldPasswordField.setColumns(10);
        frame.getContentPane().add(oldPasswordField);

        // 新密码标签：提示用户输入新密码
        JLabel newPasswordLabel = new JLabel("新密码");
        newPasswordLabel.setBounds(85, 76, 54, 14);
        frame.getContentPane().add(newPasswordLabel);

        // 新密码输入框：接收用户输入的新密码（输入内容会被隐藏）
        newPasswordField = new JPasswordField();
        newPasswordField.setColumns(10);
        newPasswordField.setBounds(149, 73, 131, 20);
        frame.getContentPane().add(newPasswordField);

        // 确认密码标签：提示用户再次输入新密码
        JLabel confirmPasswordLabel = new JLabel("确认密码");
        confirmPasswordLabel.setBounds(85, 122, 54, 14);
        frame.getContentPane().add(confirmPasswordLabel);

        // 确认密码输入框：用于验证新密码输入的一致性
        confirmPasswordField = new JPasswordField();
        confirmPasswordField.setColumns(10);
        confirmPasswordField.setBounds(149, 119, 131, 20);
        frame.getContentPane().add(confirmPasswordField);

        // 确定按钮：触发密码修改逻辑
        JButton confirmButton = new JButton("确定");
        confirmButton.setBounds(43, 200, 96, 22);
        frame.getContentPane().add(confirmButton);

        // 为确定按钮绑定点击事件监听器
        confirmButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 获取用户输入的密码信息
                String oldPassword = oldPasswordField.getText().trim(); // 去除前后空格，避免输入误操作
                String newPassword = new String(newPasswordField.getPassword()); // JPasswordField需通过getPassword()获取
                String confirmPassword = new String(confirmPasswordField.getPassword());

                // 1. 验证输入完整性：检查是否有空字段
                if (oldPassword.isEmpty() || newPassword.isEmpty() || confirmPassword.isEmpty()) {
                    JOptionPane.showMessageDialog(frame, "新旧密码不能为空", "提示", JOptionPane.WARNING_MESSAGE);
                    return; // 输入不完整，终止后续操作
                }

                // 2. 验证新密码一致性：新密码与确认密码必须相同
                if (!newPassword.equals(confirmPassword)) {
                    JOptionPane.showMessageDialog(frame, "新密码和确认密码不一致", "提示", JOptionPane.WARNING_MESSAGE);
                    return; // 密码不一致，终止后续操作
                }

                // 3. 获取当前登录的管理员对象（从静态变量中读取）
                Admin currentLoginAdmin = Admin.currentLoginAdmin;
                // 4. 调用DAO层方法执行密码修改逻辑
                int result = AdminDao.changePassword(currentLoginAdmin, oldPassword, newPassword);

                // 5. 根据修改结果提示用户
                if (result == 1) {
                    JOptionPane.showMessageDialog(frame, "修改成功", "提示", JOptionPane.INFORMATION_MESSAGE);
                    frame.dispose(); // 修改成功后关闭当前窗口
                } else {
                    JOptionPane.showMessageDialog(frame, "旧密码错误", "提示", JOptionPane.ERROR_MESSAGE);
                }
            }
        });

        // 取消按钮：关闭当前窗口，放弃修改
        JButton cancelButton = new JButton("取消");
        cancelButton.setBounds(249, 200, 96, 22);
        frame.getContentPane().add(cancelButton);

        // 为取消按钮绑定点击事件监听器
        cancelButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                frame.dispose(); // 关闭窗口
            }
        });
    }
}